package logica;

import java.io.FileNotFoundException;
import java.io.IOException;

import value_objects.VoArma;
import value_objects.VoNombreArma;
import auxiliares.Configuracion;

public class Arma extends ObjetoMapeable {
	
	private int idTipoArma;
	private String nombre;
	private int anguloMovimiento;
	private int alcanceActual;
	private int cantMunicionActual;
	private int danioVelocidad;
	private DanioArma danioArmas;
	private int danioBlindaje;
	
	/**
	 * Conatructor normal a partir del tipo de arma
	 * @param _idTipoArma
	 */
	public Arma(int _idTipoArma) {
		super();
		this.idTipoArma = _idTipoArma;
	}
	
	/**
	 * Inicializa todos los datos del arma a partir de los archivos de configuracion y el tipo barco en el que está
	 * @param _idTipoBarco
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public void inicializar(Integer _idTipoBarco) throws FileNotFoundException, IOException {
		//Cargar Properties del barco según configuración
		Configuracion p = Configuracion.getInstancia(Configuracion.CONFIGURACION_ARMAS);
		Configuracion multiplicador = Configuracion.getInstancia(Configuracion.CONFIGURACION_MULTIPLICADORES);
		
		setLargo(Integer.parseInt(p.getProperty("largo" + idTipoArma).trim())); 
		setAncho(Integer.parseInt(p.getProperty("ancho" + idTipoArma).trim()));  
		setNombre(p.getProperty("nombre" + idTipoArma).trim()); 
		setAnguloMovimiento(Integer.parseInt(p.getProperty("anguloMovimiento" + idTipoArma).trim())); 
		setAlcanceActual(Integer.parseInt(p.getProperty("alcanceActual" + idTipoArma).trim()) *
	              		 Integer.parseInt(multiplicador.getProperty("alcanceActual" + _idTipoBarco).trim())); 
		setCantMunicionActual(Integer.parseInt(p.getProperty("cantMunicionActual" + idTipoArma).trim()) *
	              			  Integer.parseInt(multiplicador.getProperty("cantMunicionActual" + _idTipoBarco).trim())); 
		setDanioVelocidad(Integer.parseInt(p.getProperty("danioVelocidad" + idTipoArma).trim()) *
			              Integer.parseInt(multiplicador.getProperty("danioVelocidad" + _idTipoBarco).trim()));
		setDanioBlindaje(Integer.parseInt(p.getProperty("danioBlindaje" + idTipoArma).trim()) *
	              		 Integer.parseInt(multiplicador.getProperty("danioBlindaje" + _idTipoBarco).trim()));
		Integer danioAlcance = Integer.parseInt(p.getProperty("danioAlcance" + idTipoArma).trim()) *
	              			   Integer.parseInt(multiplicador.getProperty("danioAlcance" + _idTipoBarco).trim()); 
		int danioCantMuniciones = Integer.parseInt(p.getProperty("danioCantMuniciones" + idTipoArma).trim()) *
	              Integer.parseInt(multiplicador.getProperty("danioCantMuniciones" + _idTipoBarco).trim());
		setDanioArmas(new DanioArma(danioAlcance, danioCantMuniciones));
	}
	
	/**
	 * Retorna el alcance máximo de los disparos del arma
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public int darAlcanceMaximo() throws FileNotFoundException, IOException {
		Configuracion p = Configuracion.getInstancia(Configuracion.CONFIGURACION_ARMAS);
		return Math.round(
				Integer.parseInt(p.getProperty("alcanceActual" + idTipoArma).trim())
			);
	}
	
	/**
	 * Devuelve la cantidad de municiones máxima del arma
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public int darCantMunicionMaximo() throws FileNotFoundException, IOException {
		Configuracion p = Configuracion.getInstancia(Configuracion.CONFIGURACION_ARMAS);
		return Math.round(
				Integer.parseInt(p.getProperty("cantMunicionActual" + idTipoArma).trim())
			);
	}
	
	/**
	 * Devuelve la información del arma útil para el cliente
	 * @return
	 */
	public VoArma obtenerInfoArma() {
		return (new VoArma(getIdTipoArma(), getAlcanceActual(), getCantMunicionActual()));
	}

	/**
	 * Devuelve un xml con las propiedades del arma
	 * @param nombreBarco
	 * @return
	 */
	public String getXML(String nombreBarco) {
		return 	"<Arma" + nombreBarco + ">" +
			"<NombreArma>" + getNombre() + "</NombreArma>" +
			"<Largo>" + getLargo() + "</Largo>" +
			"<Ancho>" + getAncho() + "</Ancho>" +
			"<AnguloMov>" + getAnguloMovimiento() + "</AnguloMov>" +
			"<AlcanceActual>"+ getAlcanceActual() + "</AlcanceActual>" +
			"<CantMunicionesActual>" + getCantMunicionActual() + "</CantMunicionesActual>" +
			"<DanioBlindaje>" + getDanioBlindaje() + "</DanioBlindaje>" +
			"<DanioVelocidad>" + getDanioVelocidad() + "</DanioVelocidad>" +
			"<IdTipoArma>" + getIdTipoArma() + "</IdTipoArma>" +
			"<CoordX>" + getPosicion().getCoordX() + "</CoordX>" +
			"<CoordY>" + getPosicion().getCoordY() + "</CoordY>" +
			"<DanioAlcance>" + getDanioArmas().getDanioAlncance() + "</DanioAlcance>" +
			"<DanioCantMuniciones>" + getDanioArmas().getDanioCantMuniciones() + "</DanioCantMuniciones>" +
			"</Arma" + nombreBarco + ">";
	}
	
	/**
	 * Devuelve un value object los nombres de todas las armas del sistema
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static VoNombreArma[] getNombresArmas() throws FileNotFoundException, IOException {
		VoNombreArma[] nombresArmas = new VoNombreArma[3];
		Configuracion config = Configuracion.getInstancia(Configuracion.CONFIGURACION_ARMAS);
		for (Integer i = 0; i < 3; i++) {
			nombresArmas[i] = new VoNombreArma((i+1), config.getProperty("nombre" + (i+1)));
		}
		return nombresArmas;
	}
	
	// ********************* GETTERS Y SETTERS *********************
	
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String _nombre) {
		this.nombre = _nombre;
	}
	
	public int getAnguloMovimiento() {
		return anguloMovimiento;
	}
	
	public void setAnguloMovimiento(int _anguloMovimiento) {
		this.anguloMovimiento = _anguloMovimiento;
	}
	
	public int getAlcanceActual() {
		return alcanceActual;
	}
	
	public void setAlcanceActual(int _alcanceActual) {
		this.alcanceActual = _alcanceActual;
	}
	
	public int getCantMunicionActual() {
		return cantMunicionActual;
	}
	
	public void setCantMunicionActual(int _cantMunicionActual) {
		this.cantMunicionActual = _cantMunicionActual;
	}
	
	public int getDanioVelocidad() {
		return danioVelocidad;
	}
	
	public void setDanioVelocidad(int _danioVelocidad) {
		this.danioVelocidad = _danioVelocidad;
	}
	
	public DanioArma getDanioArmas() {
		return danioArmas;
	}
	
	public void setDanioArmas(DanioArma _DanioArmas) {
		this.danioArmas = _DanioArmas;
	}
	
	public int getDanioBlindaje() {
		return danioBlindaje;
	}
	
	public void setDanioBlindaje(int _danioBlindaje) {
		this.danioBlindaje = _danioBlindaje;
	}
	
	public int getIdTipoArma() {
		return idTipoArma;
	}
	
	public void setIdTipoArma(int _idTipoArma) {
		this.idTipoArma = _idTipoArma;
	}
}
